#include <iostream>
#include <stddef.h>

/**
 * 实现string类
 * 
 * 核心是实现以下函数
 * strcpy,strcat,strlen
 * 
 * void build(const char* str, const size_t len);
 * string& append(const char* str, const size_t len);
 * string add(const char* str, const size_t len);
 * 
 * 构造函数，成员函数都是调用的以上函数
 * 
*/
class CString {
public:
  //构造函数
  CString();

  CString(const char* str);
  CString(const CString& str);

  CString& operator=(const CString& str);
  CString& operator=(const char* str);

  /**
   * append函数:修改原来的值,返回原值
  */
  CString& append(const CString& str);
  CString& append(const char* str);

  /**
   * 重载+号,不修改原来的值,返回一个新的string
  */
  CString operator+(const CString& str);
  CString operator+(const char* str);

  char& operator[](size_t index);

  virtual ~CString();
  
  size_t length() const;  // 返回字符串长度
  const char* data() const; // 返回c风格的char指针

  friend std::ostream& operator<<(std::ostream& os, const CString& str);

private:
  /**
   * 自己实现的一些库函数
  */
  char* strcpy(char *dst, const char *src);
  char* strcat(char *dst, const char *src);
  size_t strlen(const char *str);
  /**
   * 构造string核心函数
  */
  void build(const char* str, const size_t len);
  /**
   * append核心函数,返回原值
  */
  CString& append(const char* str, const size_t len);
  /**
   * 重载+号核心函数,返回一个新的string
  */
  CString add(const char* str, const size_t len);

  size_t length_;
  char* data_;
};
